# -*- coding: utf-8 -*-
import json
import traceback
from mod.common.minecraftEnum import ItemPosType
from mod.server import extraServerApi
from legendaryPowerScript._lpcommon import apiUtil
from legendaryPowerScript.item.inventory import Inventory
from legendaryPowerScript.item.itemTypes import ItemType
from legendaryPowerScript.item.legendaryItem import LegendaryItem
class VanillaInventory(Inventory):
    # type: () -> None
    """
    原版物品栏类，包含多种方便操作原版物品栏的函数
    在server.yml中开启了“使用生存背包”时，玩家的背包会是此类的实例。否则会是Inventory
    若有原版玩法，请选择此物品栏。由于物品实际上全部是存在原版背包中，因此是无法扩展原版背包没有的功能的，需要注意
    另外，此类继承了Inventory，所以直接把它当作Inventory一样用也是没问题的

    属性：
        - fighter (Fighter)：所属的角色
    """
    self.- fighter  = Fighter()

    def getItem(self, slot, type=None):
        # type: (int, int) -> LegendaryItem
        """
        获取指定槽位的物品

        参数：
            - slot (int)：槽位编号
            - type (int or None)：物品所在区域，可选值为0（背包）、1（装备）、2（快捷栏）、3（幻化栏），默认为None

        返回：
            - item (LegendaryItem or None)：指定槽位的物品对象，如果找不到物品，则返回None
        """
        pass

    def getHoldingItem(self):
        # type: () -> None
        """
        获取玩家手持物品。仅在使用原版背包时有用

        参数：
            无。

        返回：
            - item：当前玩家手持物品对象，若不存在则返回 None。
        """
        pass

    def getHoldingSlot(self):
        # type: () -> None
        """
        获取玩家当前手持的槽位

        参数：
            无。

        返回：
            - int：当前玩家手持的槽位
        """
        pass

    def sort(self):
        # type: () -> None
        """
        根据物品文件的路径，整理背包

        参数：
            无

        返回：
            无
        """
        pass

    def move(self, fromSlot, toSlot):
        # type: (int, int) -> None
        """
        移动物品。

        参数：
            - fromSlot (int)：移动物品的起始槽位
            - toSlot (int)：移动物品的目标槽位

        返回：
            无
        """
        pass

    def getAllItems(self):
        # type: () -> dict[int, LegendaryItem]
        """
        获取所有物品栏中的物品

        参数：
            - 无

        返回：
            - items (dict[int, LegendaryItem])：包含所有物品的字典，键为槽位编号，值为物品对象
        """
        pass

    def setItem(self, slot, item, type=None):
        # type: (int, LegendaryItem, int) -> NoneType
        """
        设置物品到指定槽位

        参数：
            - slot (int)：槽位编号
            - item (LegendaryItem)：要设置的物品
            - type (int)：物品所在区域，可选值为0（背包）、1（装备）、2（快捷栏），默认为0

        返回：
            - None (NoneType)：无返回值
        """
        return NoneType()


    def takeItem(self, itemType, amount, skipSlot=None, bc=False):
        # type: (ItemType, int) -> tuple[int, LegendaryItem]
        """
        取出指定类型的物品数量

        参数：
            - itemType (ItemType or list[ItemType])：要取出的物品类型
            - amount (int)：要取出的物品数量
            - skipSlot (set(tuple[int, int]))：要跳过的槽位集合，默认为None
            - bc (bool)：是否绑定计数，默认为False

        返回：
            - tuple[int, LegendaryItem]：成功取出的物品数量和物品对象的元组，如果没有成功取出物品，则返回剩余未取出的数量和None
        """
        pass

    def getItemHasAmountByParam(self, param, skipSlot=None):
        # type: (dict) -> int
        """
        根据物品表达式（item.toGetItemParam())获取满足该条件的物品数量。

        参数：
            - param (dict)：需要满足的物品表达式

        返回：
            - hasAmount (int)：具有指定参数的物品的数量
        """
        return 0


    def getItemHasAmount(self, itemType):
        # type: (Item) -> int
        """
        获取特定类型物品的数量。

        参数：
            - itemType (Item)：物品类型

        返回：
            - hasAmount (int)：特定类型物品的数量
        """
        return 0


    def getEquipment(self, slot, disguise=False):
        """
        获取指定装备槽位的装备。

        参数：
            - slot (int)：装备槽位。
            - disguise (bool)：是否假装。

        返回：
            - LegendaryItem/None：指定槽位的装备对象，若不存在则返回 None。
        """
        pass

    def isFull(self, amount=1):
        # type: (int) -> None
        """
        判断背包是否已满。

        参数：
            - amount (int)：需要添加的物品数量（默认为 1）。

        返回：
            - bool：背包是否已满。
        """
        pass

    def takeAmount(self, slot, amount, type=None):
        # type: (int, int/float, dict/int/None) -> None
        """
        从背包或装备栏中取出指定数量的物品。

        参数：
            - slot (int)：物品槽位。
            - amount (int/float)：需要取出的物品数量。
            - type (dict/int/None)：取出物品的类型。默认为 None，即在所有物品中查找。

        返回：
            - None。
        """
        pass

    def serializeInventory(self, isSave=False):
        # type: (bool) -> None
        """
        将背包中的物品序列化为字典。

        参数：
            - isSave (bool)：是否是用于保存。

        返回：
            - dict：包含序列化后物品信息的字典。
        """
        pass

    def serializeEquipment(self, isSave=False):
        # type: (bool) -> None
        """
        将装备栏中的物品序列化为字典。

        参数：
            - isSave (bool)：是否是用于保存。

        返回：
            - dict：包含序列化后物品信息的字典。
        """
        pass

    def refreshInventoryTooltip(self):
        # type: () -> None
        """
        刷新物品栏的提示信息。

        参数：
            无

        返回：
            无
        """
        pass

    def viewInText(self, fighter, name, prefix=""):
        # type: (Fighter or ConsoleSender or MasterSender, str, str, optional) -> None
        """
        用文本的形式打印背包信息。

        参数：
            - fighter (Fighter or ConsoleSender or MasterSender)：信息接收者
            - name (str)：物品栏名称。
            - prefix (str, optional)：前缀字符串，默认为空。

        返回：
            无
        """
        pass

